package while_lang.semantics;

import java.util.*;

/** Representación de un estado de ejecución del lenguaje While extendido.
 *  @author Leonardo Val.
 */
public class State {
	private final Map<String, Variable> variables = new HashMap<String, Variable>();
	
	/** El constructor de State permite armar estados con variables inicialmente 
	 * 	de manera más simple.
	 *  Por ejemplo: new State(new Variable("x", IntegerType.SINGLETON)); 
	 */
	public State(Variable... init) {
		for (int i = 0; i + 1 < init.length; i += 2) {
			declare(init[i]);
		}
	}
	
	public Variable variable(String id) {
		if (variables.containsKey(id)) {
			return variables.get(id);
		} else {
			throw new Error("La variable "+ id +" no está declarada.");			
		}		
	}
	
	public Variable declare(Variable var) {
		if (variables.containsKey(var.id)) {
			throw new Error("La variable "+ var.id +" ya está declarada.");
		}
		variables.put(var.id, var);
		return var;
	}
	
	public String toString() {
		int length = variables.size();
		String[] ids = variables.keySet().toArray(new String[length]);
		Arrays.sort(ids);
		StringBuilder buffer = new StringBuilder("{ ");
		if (length > 0) {
			buffer.append(variable(ids[0]));
			for (int i = 1; i < length; i++) {
				buffer.append(", ").append(variable(ids[i]));
			}
		}
		return buffer.append(" }").toString();
	}
	
}
